From 3c41884d2887ee4d0aa19e7f98b6b3b081ec770b Mon Sep 17 00:00:00 2001 From: Lars Magne Ingebrigtsen Date: Mon, 21 Nov 2011 19:21:42 +0100 Subject: [PATCH] Fix asynchrounous GnuTLS socket handling on some versions of the GnuTLS library. Some versions of the GnuTLS library doesn't respons to poll reliably. Work around this by checking all GnuTLS sockets explicitly from the idle loop. --- src/ChangeLog | 5 +++++ src/process.c | 42 +++++++++++++++++++++++++++++++++--------- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index c58a8e095c9..6ef2538d636 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2011-11-21 Lars Magne Ingebrigtsen + + * process.c (wait_reading_process_output): Fix asynchrounous + GnuTLS socket handling on some versions of the GnuTLS library. + 2011-11-21 Jan Djärv * xterm.c (x_clear_frame): Reinstate the XClearWindow call. diff --git a/src/process.c b/src/process.c index bea9e72019b..02eb1122a07 100644 --- a/src/process.c +++ b/src/process.c @@ -4620,15 +4620,39 @@ wait_reading_process_output (int time_limit, int microsecs, int read_kbd, some data in the TCP buffers so that select works, but with custom pull/push functions we need to check if some data is available in the buffers manually. */ - if (nfds == 0 && - wait_proc && wait_proc->gnutls_p /* Check for valid process. */ - /* Do we have pending data? */ - && emacs_gnutls_record_check_pending (wait_proc->gnutls_state) > 0) - { - nfds = 1; - /* Set to Available. */ - FD_SET (wait_proc->infd, &Available); - } + if (nfds == 0) + { + if (! wait_proc) + { + /* We're not waiting on a specific process, so loop + through all the channels and check for data. */ + struct Lisp_Process *proc; + for (channel = 0; channel < MAXDESC; ++channel) + { + if (! NILP (chan_process[channel]) && + (proc = XPROCESS (chan_process[channel])) != NULL && + proc->gnutls_p && + proc->infd && + emacs_gnutls_record_check_pending (proc->gnutls_state) > 0) + { + nfds++; + FD_SET (proc->infd, &Available); + } + } + } + else + { + /* Check this specific channel. */ + if (wait_proc->gnutls_p && /* Check for valid process. */ + /* Do we have pending data? */ + emacs_gnutls_record_check_pending (wait_proc->gnutls_state) > 0) + { + nfds = 1; + /* Set to Available. */ + FD_SET (wait_proc->infd, &Available); + } + } + } #endif } -- 2.30.2